package com.xutianpeng.disk.file.service.impl;

import com.xutianpeng.disk.file.entity.SearchFileEntity;
import com.xutianpeng.disk.file.repository.FileDao;
import com.xutianpeng.disk.file.service.FileService;
import com.xutianpeng.disk.mybatis.entity.PtFileEntity;
import com.xutianpeng.disk.mybatis.flexigrid.PagingEntity;
import com.xutianpeng.disk.mybatis.flexigrid.TblResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
public class FileServiceImpl implements FileService {
    @Resource
    private FileDao fileDao;

    @Override
    public void saveFileInfo(List<PtFileEntity> ptFileEntityList) {
        fileDao.deleteFileAll();
        fileDao.saveFileInfo(ptFileEntityList);
    }

    @Override
    public TblResponseEntity<PtFileEntity> queryFileInfoListByPage(SearchFileEntity entity, PagingEntity paging) {
        TblResponseEntity<PtFileEntity> tblResponseEntity = new TblResponseEntity<>();
        Integer total = fileDao.queryFileListTotal(entity);
        tblResponseEntity.setTotal(total);
        // 计算当前页数
        paging.deal(PtFileEntity.class, total);
        tblResponseEntity.setPage(paging.getPage());
        List<PtFileEntity> list = fileDao.queryFileInfoListByPage(entity, paging);
        tblResponseEntity.setRawRecords(list);
        tblResponseEntity.deal();
        return tblResponseEntity;
    }

    @Override
    public PtFileEntity queryFileInfoById(String fileUuid) {
        return fileDao.queryFileInfoById(fileUuid);
    }

    @Override
    public List<PtFileEntity> queryFileListAll() {
        return fileDao.queryFileListAll();
    }

    /**
     * 将文件移至回收站（更新删除标识为1）
     * 文档1独有方法，保留事务控制
     *
     * @param fileUuid 文件唯一标识
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateFileToRecycle(String fileUuid) {
        // 调用DAO层更新删除标识的方法
        fileDao.updateFileToRecycle(fileUuid);
    }

    /**
     * 批量更新文件的父目录UUID（文件移动核心操作）
     *
     * @param fileUuids       需要移动的文件UUID列表
     * @param targetParentUuid 目标父文件夹UUID
     */
    @Override
    public void updateParentUuids(List<String> fileUuids, String targetParentUuid) {
        // 调用DAO层批量更新方法
        fileDao.updateParentUuids(fileUuids, targetParentUuid);
    }

    /**
     * 查询所有文件的树形结构数据（用于前端文件树展示）
     *
     * @return 文件树形结构列表
     */
    @Override
    public List<PtFileEntity> queryAllFileTree() {
        // 调用DAO层查询文件树方法
        return fileDao.queryAllFileTree();
    }

    /**
     * 重命名文件实现（文档2新增方法）
     *
     * @param fileUuid    要重命名的文件UUID
     * @param newFileName 新的文件名
     * @return 操作结果信息
     * @throws Exception 处理过程中可能抛出的异常
     */
    @Override
    public String renameFile(String fileUuid, String newFileName) throws Exception {
        // 1. 验证参数
        if (fileUuid == null || fileUuid.trim().isEmpty()) {
            throw new IllegalArgumentException("文件UUID不能为空");
        }
        if (newFileName == null || newFileName.trim().isEmpty()) {
            throw new IllegalArgumentException("新文件名不能为空");
        }

        // 2. 查询文件是否存在
        PtFileEntity fileEntity = fileDao.queryFileInfoById(fileUuid);
        if (fileEntity == null) {
            return "文件不存在，无法重命名";
        }

        // 3. 处理文件名（保留原扩展名，如果新文件名不含扩展名）
        String oldFileName = fileEntity.getFileName();
        String fileSuffix = "";
        int lastDotIndex = oldFileName.lastIndexOf(".");
        if (lastDotIndex > 0) {
            fileSuffix = oldFileName.substring(lastDotIndex);
            // 如果新文件名不含扩展名，则自动添加原扩展名
            if (newFileName.lastIndexOf(".") == -1) {
                newFileName += fileSuffix;
            }
        }

        // 4. 检查是否与原文件名相同
        if (newFileName.equals(oldFileName)) {
            return "新文件名与原文件名相同";
        }

        // 5. 更新文件名
        fileEntity.setFileName(newFileName);
        int updateCount = fileDao.updateFileName(fileEntity);

        // 6. 返回操作结果
        return updateCount > 0 ? "文件重命名成功" : "文件重命名失败，请重试";
    }
}